/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controller;

import Model.EstadoFacadeRemote;
import Model.Estadoproductofecha;
import Model.EstadoproductofechaFacadeRemote;
import Model.Novedad;
import Model.NovedadFacadeRemote;
import Model.Orden;
import Model.OrdenFacadeRemote;
import Model.Producto;
import Model.ProductoFacadeRemote;
import Model.Razon;
import Model.RazonFacadeRemote;
import Model.Tipoorden;
import Model.TipoordenFacadeRemote;
import Model.Usuario;
import Model.UsuarioFacadeRemote;
import java.util.ArrayList;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.Map;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.servlet.http.HttpSession;

/**
 * Controlador web de la aplicación
 * @author Diego Casas
 */
@ManagedBean
@RequestScoped
public class webController {

    @EJB
    private EstadoFacadeRemote estadoFacade;
    @EJB
    private EstadoproductofechaFacadeRemote estadoproductofechaFacade;

    public webController() {
    }
    @EJB
    private NovedadFacadeRemote novedad;
    private int idOrden;
    private int idRazon;
    private String Desc_novedad;
    private String res;
    private String mapa_str;

    public String getRes() {
        return res;
    }

    public void setRes(String res) {
        this.res = res;
    }

    public String getDesc_novedad() {
        return Desc_novedad;
    }

    public void setDesc_novedad(String Desc_novedad) {
        this.Desc_novedad = Desc_novedad;
    }

    public int getIdOrden() {
        return idOrden;
    }

    public void setIdOrden(int idOrden) {
        this.idOrden = idOrden;
    }

    public int getIdRazon() {
        return idRazon;
    }

    public void setIdRazon(int idRazon) {
        this.idRazon = idRazon;
    }

    public NovedadFacadeRemote getNovedad() {
        return novedad;
    }

    public void setNovedad(NovedadFacadeRemote novedad) {
        this.novedad = novedad;
    }

    public String crearNovedad() {

        try {
            Novedad nueva = new Novedad();
            nueva.setDescripcion(getDesc_novedad());
            nueva.setIdNovedad(novedad.findAll().size() + 1);
            nueva.setIdOrden(getIdOrden());
            nueva.setRazon(getIdRazon());
            novedad.create(nueva);
            setRes("Novedad creada correctamente");
            return "NovedadCreada";
        } catch (Exception e) {
            setRes("Novedad no creada");
            return "NovedadNoCreada";
        }
    }
    @EJB
    private OrdenFacadeRemote orden;
    private int idUsuario;
    private String idDispositivo;
    private int numeroFactura;
    private boolean estado = false;
    private Date fechahora;
    private String fechahora_str;
    private ArrayList<Orden> ordenList = new ArrayList<Orden>();
    private Orden actual;
    private String tipo_radio = "";
    private String tipo_str;
    private int GTM = -3; //GTM

    public String getTipo_str() {
        return tipo_str;
    }

    public void setTipo_str(String tipo_str) {
        this.tipo_str = tipo_str;
    }

    public String getTipo_radio() {
        return tipo_radio;
    }

    public void setTipo_radio(String tipo_radio) {
        this.tipo_radio = tipo_radio;
    }

    public String getFechahora_str() {
        getFechahora();
        return fechahora_str;
    }

    public void setFechahora_str(String fechahora_str) {
        this.fechahora_str = fechahora_str;
    }

    public Date getFechahora() {
        fechahora = new Date(GregorianCalendar.getInstance().get(GregorianCalendar.YEAR) - 1900, GregorianCalendar.getInstance().get(GregorianCalendar.MONTH), GregorianCalendar.getInstance().get(GregorianCalendar.DAY_OF_MONTH), GregorianCalendar.getInstance().get(GregorianCalendar.HOUR_OF_DAY), GregorianCalendar.getInstance().get(GregorianCalendar.MINUTE), GregorianCalendar.getInstance().get(GregorianCalendar.SECOND));
        fechahora_str = GregorianCalendar.getInstance().get(GregorianCalendar.DAY_OF_MONTH) + "/" + (GregorianCalendar.getInstance().get(GregorianCalendar.MONTH) + 1) + "/" + GregorianCalendar.getInstance().get(GregorianCalendar.YEAR) + " " + GregorianCalendar.getInstance().get(GregorianCalendar.HOUR_OF_DAY) + ":" + GregorianCalendar.getInstance().get(GregorianCalendar.MINUTE) + ":" + GregorianCalendar.getInstance().get(GregorianCalendar.SECOND);
        return fechahora;
    }

    public void setFechahora(Date fechahora) {
        this.fechahora = fechahora;
    }

    public boolean isEstado() {
        return estado;
    }

    public void setEstado(boolean estado) {
        this.estado = estado;
    }

    public int getNumeroFactura() {
        return numeroFactura;
    }

    public void setNumeroFactura(int numeroFactura) {
        this.numeroFactura = numeroFactura;
    }

    public OrdenFacadeRemote getOrden() {
        return orden;
    }

    public void setOrden(OrdenFacadeRemote orden) {
        this.orden = orden;
    }

    public Orden getActual() {
        return actual;
    }

    public void setActual(Orden actual) {
        this.actual = actual;
    }

    public String getIdDispositivo() {
        return idDispositivo;
    }

    public void setIdDispositivo(String idDispositivo) {
        this.idDispositivo = idDispositivo;
    }

    public int getIdUsuario() {
        return idUsuario;
    }

    public void setIdUsuario(int idUsuario) {
        this.idUsuario = idUsuario;
    }

    public ArrayList<Orden> getOrdenList() {
        return ordenList;
    }

    public void setOrdenList(ArrayList<Orden> ordenList) {
        this.ordenList = ordenList;
    }

    public void IngresarOrden() {
        Orden tmp = new Orden(orden.findAll().size() + 1, getIdUsuario(), getIdDispositivo(), getNumeroFactura(), false);
        tmp.setFechaHora(fechahora);
        orden.create(tmp);
    }

    public String IngresarOrdenInstalacion() {
        try {
            if (tipo_radio.equalsIgnoreCase("Satisfactorio")) {
                setEstado(true);
            } else {
                setEstado(false);
            }
            Orden tmp = new Orden(orden.findAll().size() + 1, getIdUsuario(), getIdDispositivo(), getNumeroFactura(), isEstado());
            tmp.setTipo(1);
            tmp.setFechaHora(getFechahora());
            orden.create(tmp);
            setRes("Orden de instalacion ingresada correctamente. El número de orden es: " + tmp.getIdOrden());
            return "OrdenInstalacionIngresada";
        } catch (Exception e) {
            setRes("Error de ingreso en la orden de instalación");
            return "OrdenInstalacionNoIngresada";
        }
    }

    public String IngresarOrdenMantenimiento() {
        try {
            if (tipo_radio.equalsIgnoreCase("Satisfactorio")) {
                setEstado(true);
            } else {
                setEstado(false);
            }
            Orden tmp = new Orden(orden.findAll().size() + 1, getIdUsuario(), getIdDispositivo(), getNumeroFactura(), isEstado());
            tmp.setTipo(2);
            tmp.setFechaHora(getFechahora());
            orden.create(tmp);
            setRes("Orden de mantenimiento ingresada correctamente. El número de orden es: " + tmp.getIdOrden());
            return "OrdenMantenimientoIngresada";
        } catch (Exception e) {
            setRes("Error de ingreso en la orden de mantenimiento");
            return "OrdenMantenimientoNoIngresada";
        }
    }

    public String IngresarOrdenRecambio() {
        try {
            if (tipo_radio.equalsIgnoreCase("Satisfactorio")) {
                setEstado(true);
            } else {
                setEstado(false);
            }
            Orden tmp = new Orden(orden.findAll().size() + 1, getIdUsuario(), getIdDispositivo(), getNumeroFactura(), isEstado());
            tmp.setTipo(3);
            tmp.setFechaHora(getFechahora());
            orden.create(tmp);
            setRes("Orden de recambio ingresada correctamente. El número de orden es: " + tmp.getIdOrden());
            return "OrdenRecambioIngresada";
        } catch (Exception e) {
            setRes("Error de ingreso en la orden de recambio");
            return "OrdenInstalacionNoIngresada";
        }
    }

    public String ActualizarOrden() {

        boolean est_temp = false;
        FacesContext context = FacesContext.getCurrentInstance();
        Map map = context.getExternalContext().getRequestParameterMap();
        String localVariable = (String) map.get("j_idt9:orden");

        int tmp = Integer.parseInt(localVariable);
        Orden nuevo = new Orden();
        for (int i = 0; i < orden.findAll().size(); i++) {
                if (orden.findAll().get(i).getIdOrden() == tmp){
                nuevo.setFechaHora(orden.findAll().get(i).getFechaHora());
                nuevo.getFechaHora().setHours(nuevo.getFechaHora().getHours() + GTM); //GTM
                nuevo.setEstado(orden.findAll().get(i).getEstado());
                nuevo.setIdUsuario(orden.findAll().get(i).getIdUsuario());
                nuevo.setProductoID(orden.findAll().get(i).getProductoID());
                nuevo.setNumeroFactura(orden.findAll().get(i).getNumeroFactura());
                nuevo.setIdOrden(orden.findAll().get(i).getIdOrden());
                nuevo.setTipo(orden.findAll().get(i).getTipo());
                nuevo.setDescripcion(orden.findAll().get(i).getDescripcion());
                i = orden.findAll().size();
                }
            }

        if (tipo_radio.equalsIgnoreCase("Satisfactorio")) {
            est_temp = true;
        } else {
            est_temp = false;
        }
        nuevo.setEstado(est_temp);
        orden.edit(nuevo);

        if (est_temp == true){
            setRes("Orden actualizada correctamente");
            return "fin";
        }else{
            return "novedad";
        }

    }

    public String cargarOrdenes() {
        try {
            ordenList.clear();
            for (int i = 0; i < orden.findAll().size(); i++) {
                Orden nuevo = new Orden();
                nuevo.setFechaHora(orden.findAll().get(i).getFechaHora());
                nuevo.getFechaHora().setHours(nuevo.getFechaHora().getHours() + GTM); //GTM
                nuevo.setEstado(orden.findAll().get(i).getEstado());
                nuevo.setIdUsuario(orden.findAll().get(i).getIdUsuario());
                nuevo.setProductoID(orden.findAll().get(i).getProductoID());
                nuevo.setNumeroFactura(orden.findAll().get(i).getNumeroFactura());
                nuevo.setIdOrden(orden.findAll().get(i).getIdOrden());
                nuevo.setTipo(orden.findAll().get(i).getTipo());
                nuevo.setDescripcion(orden.findAll().get(i).getDescripcion());
                ordenList.add(nuevo);
            }
            return "Lista";
        } catch (Exception e) {
            return "NoLista";
        }
    }

    public String OrdenbyID() {
        cargarOrdenes();
        for (int i = 0; i < ordenList.size(); i++) {
             if (ordenList.get(i).getIdOrden() == idOrden){
                setFechahora(ordenList.get(i).getFechaHora());
                setEstado(ordenList.get(i).getEstado());
                setIdUsuario(ordenList.get(i).getIdUsuario());
                setIdDispositivo(ordenList.get(i).getProductoID());
                setNumeroFactura(ordenList.get(i).getNumeroFactura());
                setTipo_str(ordenList.get(i).getTipo()+"");
                if (ordenList.get(i).getEstado()) {
                    setTipo_radio("Satisfactorio");
                } else {
                    setTipo_radio("NoSatisfactorio");
                }
                return "Ok";
            }
        }
        setRes("Orden de instalación no encontrada");
        return "No";
    }

    public String OrdenMantenimientobyID() {
        cargarOrdenes();
        for (int i = 0; i < ordenList.size(); i++) {
            if (ordenList.get(i).getIdOrden() == idOrden && ordenList.get(i).getTipo() == 2) {
                setFechahora(ordenList.get(i).getFechaHora());
                setEstado(ordenList.get(i).getEstado());
                setIdUsuario(ordenList.get(i).getIdUsuario());
                setIdDispositivo(ordenList.get(i).getProductoID());
                setNumeroFactura(ordenList.get(i).getNumeroFactura());
                setTipo_str("Mantenimiento");
                if (ordenList.get(i).getEstado()) {
                    setTipo_radio("Satisfactorio");
                } else {
                    setTipo_radio("NoSatisfactorio");
                }
                return "Ok";
            }
        }
        setRes("Orden de manteinimiento no encontrada");
        return "No";
    }

    public String OrdenRecambiobyID() {
        cargarOrdenes();
        for (int i = 0; i < ordenList.size(); i++) {
            if (ordenList.get(i).getIdOrden() == idOrden && ordenList.get(i).getTipo() == 3) {
                setFechahora(ordenList.get(i).getFechaHora());
                setEstado(ordenList.get(i).getEstado());
                setIdUsuario(ordenList.get(i).getIdUsuario());
                setIdDispositivo(ordenList.get(i).getProductoID());
                setNumeroFactura(ordenList.get(i).getNumeroFactura());
                setTipo_str("Recambio");
                if (ordenList.get(i).getEstado()) {
                    setTipo_radio("Satisfactorio");
                } else {
                    setTipo_radio("NoSatisfactorio");
                }
                return "Ok";
            }
        }
        setRes("Orden de recambio no encontrada");
        return "No";
    }

    public int getGTM() {
        return GTM;
    }

    public void setGTM(int GTM) {
        this.GTM = GTM;
    }

    public void emptyRes() {
        res = "";
    }
    @EJB
    private ProductoFacadeRemote producto;
    private String EAN;
    private String Descr_producto;
    private int Costo;
    private int EstadoProducto;
    private String Ubicacion;
    private ArrayList<Producto> productoList = new ArrayList<Producto>();
    private ArrayList<SelectItem> eanList = new ArrayList<SelectItem>();

    public ArrayList<SelectItem> getEanList() {
        cargarProductos();
        return eanList;
    }

    public void setEanList(ArrayList<SelectItem> eanList) {
        this.eanList = eanList;
    }

    public ProductoFacadeRemote getProducto() {
        return producto;
    }

    public void setProducto(ProductoFacadeRemote producto) {
        this.producto = producto;
    }

    public ArrayList<Producto> getProductoList() {
        return productoList;
    }

    public void setProductoList(ArrayList<Producto> productoList) {
        this.productoList = productoList;
    }

    public int getCosto() {
        return Costo;
    }

    public void setCosto(int Costo) {
        this.Costo = Costo;
    }

    public String getDescr_producto() {
        return Descr_producto;
    }

    public void setDescr_producto(String Descr_producto) {
        this.Descr_producto = Descr_producto;
    }

    public String getEAN() {
        return EAN;
    }

    public void setEAN(String EAN) {
        this.EAN = EAN;
    }

    public int getEstadoProducto() {
        return EstadoProducto;
    }

    public void setEstadoProducto(int EstadoProducto) {
        this.EstadoProducto = EstadoProducto;
    }

    public String getUbicacion() {
        return Ubicacion;
    }

    public void setUbicacion(String Ubicacion) {
        this.Ubicacion = Ubicacion;
    }

    public String cargarProductos() {
        try {
            eanList.clear();
            productoList.clear();
            for (int i = 0; i < producto.findAll().size(); i++) {
                Producto nuevo = new Producto();
                nuevo.setCosto(producto.findAll().get(i).getCosto());
                nuevo.setDescripcion(producto.findAll().get(i).getDescripcion());

                //nuevo.setEstadoProducto(producto.findAll().get(i).getEstadoProducto());
                nuevo.setEan(producto.findAll().get(i).getEan());
                nuevo.setLatitud(producto.findAll().get(i).getLatitud());
                nuevo.setLongitud(producto.findAll().get(i).getLongitud());
                productoList.add(nuevo);
                SelectItem tp = new SelectItem(producto.findAll().get(i).getEan().toString(), producto.findAll().get(i).getEan().toString());
                eanList.add(tp);
            }
            return "Lista";
        } catch (Exception e) {
            return "NoLista";
        }
    }
    @EJB
    private RazonFacadeRemote razon;
    private int id_razon;
    private String desc_razon;
    private ArrayList<Razon> razonList = new ArrayList<Razon>();
    private ArrayList<SelectItem> razonesList = new ArrayList<SelectItem>();

    public String getDesc_razon() {
        return desc_razon;
    }

    public void setDesc_razon(String desc_razon) {
        this.desc_razon = desc_razon;
    }

    public int getId_razon() {
        return id_razon;
    }

    public void setId_razon(int id_razon) {
        this.id_razon = id_razon;
    }

    public RazonFacadeRemote getRazon() {
        return razon;
    }

    public void setRazon(RazonFacadeRemote razon) {
        this.razon = razon;
    }

    public ArrayList<Razon> getRazonList() {
        return razonList;
    }

    public void setRazonList(ArrayList<Razon> razonList) {
        this.razonList = razonList;
    }

    public ArrayList<SelectItem> getRazonesList() {
        razonesList.clear();
        cargarRazones();
        return razonesList;
    }

    public void setRazonesList(ArrayList<SelectItem> razonesList) {
        this.razonesList = razonesList;
    }

    public String cargarRazones() {

        try {
            razonList.clear();
            razonesList.clear();
            for (int i = 0; i < razon.findAll().size(); i++) {
                Razon tmp = new Razon();
                SelectItem st = new SelectItem();
                st.setValue(razon.findAll().get(i).getIdRazon());
                st.setLabel(razon.findAll().get(i).getDescripcion());
                tmp.setDescripcion(razon.findAll().get(i).getDescripcion());
                tmp.setIdRazon(razon.findAll().get(i).getIdRazon());
                razonList.add(tmp);
                razonesList.add(st);
            }
            return "Lista";
        } catch (Exception e) {
            return "NoLista";
        }
    }
    @EJB
    private TipoordenFacadeRemote tipoorden;
    private int idTipoOrden;
    private String descr_tipoorden;
    private ArrayList<Tipoorden> tipoordenList = new ArrayList<Tipoorden>();
    private ArrayList<SelectItem> tipo_ordenList = new ArrayList<SelectItem>();

    public ArrayList<SelectItem> getTipo_ordenList() {
        cargarTipoorden();
        return tipo_ordenList;
    }

    public void setTipo_ordenList(ArrayList<SelectItem> tipo_ordenList) {
        this.tipo_ordenList = tipo_ordenList;
    }



    public String getDescr_tipoorden() {
        return descr_tipoorden;
    }

    public void setDescr_tipoorden(String descr_tipoorden) {
        this.descr_tipoorden = descr_tipoorden;
    }

    public int getIdTipoOrden() {
        return idTipoOrden;
    }

    public void setIdTipoOrden(int idTipoOrden) {
        this.idTipoOrden = idTipoOrden;
    }

    public TipoordenFacadeRemote getTipoorden() {
        return tipoorden;
    }

    public void setTipoorden(TipoordenFacadeRemote tipoorden) {
        this.tipoorden = tipoorden;
    }

    public String cargarTipoorden() {
        try {
            for (int i = 0; i < tipoorden.findAll().size(); i++) {
                Tipoorden nuevo = new Tipoorden();
                nuevo.setIdTipoOrden(tipoorden.findAll().get(i).getIdTipoOrden());
                nuevo.setDescripcion(tipoorden.findAll().get(i).getDescripcion());
                tipoordenList.add(nuevo);
                SelectItem tp = new SelectItem(tipoorden.findAll().get(i).getIdTipoOrden(), tipoorden.findAll().get(i).getDescripcion());
                eanList.add(tp);
            }
            return "Lista";
        } catch (Exception e) {
            return "NoLista";
        }
    }

    public String getTipobyId(int id) {
        cargarTipoorden();
        for (int i = 0; i < tipoordenList.size(); i++) {
            if (id == tipoordenList.get(i).getIdTipoOrden()) {
                return tipoordenList.get(i).getDescripcion();
            }
        }
        return "";
    }
    @EJB
    private UsuarioFacadeRemote usuario;
    private int numeroUsuario;
    private String nusuario;
    private String contrasena;
    private String rol;
    private ArrayList<Usuario> usuarioList = new ArrayList<Usuario>();
    private Usuario usuario_actual;
    private ArrayList<SelectItem> empleadoList = new ArrayList<SelectItem>();

    public ArrayList<SelectItem> getEmpleadoList() {
        cargarUsuarios();
        empleadoList.clear();
        for (int i = 0; i < usuarioList.size(); i++) {
            if (usuarioList.get(i).getRol().equalsIgnoreCase("Empleado")) {
                SelectItem it = new SelectItem(usuarioList.get(i).getIdUsuario(), usuarioList.get(i).getNombre());
                empleadoList.add(it);
            }
        }
        return empleadoList;
    }

    public Usuario getUsuario_actual() {
        return usuario_actual;
    }

    public void setUsuario_actual(Usuario usuario_actual) {
        this.usuario_actual = usuario_actual;
    }

    public void setEmpleadoList(ArrayList<SelectItem> empleadoList) {
        this.empleadoList = empleadoList;
    }

    public int getNumeroUsuario() {
        return numeroUsuario;
    }

    public void setNumeroUsuario(int numeroUsuario) {
        this.numeroUsuario = numeroUsuario;
    }

    public String getContrasena() {
        return contrasena;
    }

    public void setContrasena(String contrasena) {
        this.contrasena = contrasena;
    }

    public String getNusuario() {
        return nusuario;
    }

    public void setNusuario(String nusuario) {
        this.nusuario = nusuario;
    }

    public String getRol() {
        return rol;
    }

    public void setRol(String rol) {
        this.rol = rol;
    }

    public UsuarioFacadeRemote getUsuario() {
        return usuario;
    }

    public void setUsuario(UsuarioFacadeRemote usuario) {
        this.usuario = usuario;
    }

    public String IngresarUsuario() {
        try {
            Usuario tmp = new Usuario(usuario.findAll().size() + 1, getNusuario(), getRol());
            tmp.setPassword(getContrasena());
            usuario.create(tmp);
            setNusuario("");
            setRol("");
            setContrasena("");
            setRes("Usuario ingresado correctamente");
            return "UsuarioIngresado";

        } catch (Exception e) {
            setRes("Usuario no ingresado correctamente");
            return "UsuarioNoIngresado";
        }
    }

    public ArrayList<Usuario> getUsuarioList() {
        return usuarioList;
    }

    public void setUsuarioList(ArrayList<Usuario> usuarioList) {
        this.usuarioList = usuarioList;
    }

    public String cargarUsuarios() {
        try {
            usuarioList.clear();
            for (int i = 0; i < usuario.findAll().size(); i++) {
                Usuario nuevo = new Usuario();
                nuevo.setIdUsuario(usuario.findAll().get(i).getIdUsuario());
                nuevo.setNombre(usuario.findAll().get(i).getNombre());
                nuevo.setPassword(usuario.findAll().get(i).getPassword());
                nuevo.setRol(usuario.findAll().get(i).getRol());
                usuarioList.add(nuevo);
            }
            return "Lista";
        } catch (Exception e) {
            return "NoLista";
        }
    }

    public String validarUsuario() {
        cargarUsuarios();
        try {
            for (int i = 0; i < usuarioList.size(); i++) {
                if (usuarioList.get(i).getNombre().equals(nusuario) && usuarioList.get(i).getPassword().equals(contrasena)) {
                    if (usuarioList.get(i).getRol().equals("Admin")) {
                        return "admin";
                    } else {
                        //return "usuario";
                    }
                }
            }
            setRes("Error de ingreso - Verificar datos");
            return "no";
        } catch (Exception e) {
            setRes("Error del módulo de ingreso");
            return "no";
        }
    }
    private ArrayList<inst_Empleado> instalaciones = new ArrayList<inst_Empleado>();

    public void instalacionesEmpleado() {
        instalaciones.clear();
        String nombre = "";
        int cod = 0;
        for (int i = 0; i < usuario.findAll().size(); i++) {
            cod = usuario.findAll().get(i).getIdUsuario();
            if (cod == numeroUsuario) {
                nombre = usuario.findAll().get(i).getNombre();
                i = usuario.findAll().size();
            }
        }

        for (int i = 0; i < orden.findAll().size(); i++) {
            if (numeroUsuario == orden.findAll().get(i).getIdUsuario()) {
                Producto act_inst = getProductobyID(orden.findAll().get(i).getProductoID());
                inst_Empleado temp = new inst_Empleado(act_inst.getEan(), act_inst.getDescripcion(), nombre, orden.findAll().get(i).getFechaHora().toString(), act_inst.getCosto() + "");
                instalaciones.add(temp);
            }
        }

        if (instalaciones.isEmpty()) {
            setRes("El usuario no existe o no tiene instalaciones asignadas");
        } else {
            setRes("");
        }
    }

    public Producto getProductobyID(String EAN) {
        for (int i = 0; i < producto.findAll().size(); i++) {
            if (EAN.equals(producto.findAll().get(i).getEan())) {
                Producto nuevo = new Producto();
                nuevo.setCosto(producto.findAll().get(i).getCosto());
                nuevo.setDescripcion(producto.findAll().get(i).getDescripcion());
                nuevo.setEan(EAN);
                nuevo.setLatitud(producto.findAll().get(i).getLatitud());
                nuevo.setLongitud(producto.findAll().get(i).getLongitud());
                return nuevo;
            }
        }
        return null;
    }

    public Estadoproductofecha getlastEstadoproductofecha(String EAN) {
        Estadoproductofecha est = null;
        Date ultima = new Date(0);
        for (int i = 0; i < estadoproductofechaFacade.findAll().size(); i++) {
            if (estadoproductofechaFacade.findAll().get(i).getEstadoproductofechaPK().getEan().equals(EAN)) {
                if (estadoproductofechaFacade.findAll().get(i).getEstadoproductofechaPK().getFechaEstado().after(ultima)) {
                    ultima = estadoproductofechaFacade.findAll().get(i).getEstadoproductofechaPK().getFechaEstado();
                    est = estadoproductofechaFacade.findAll().get(i);
                }
            }
        }
        return est;
    }

    public ArrayList<inst_Empleado> getInstalaciones() {
        return instalaciones;
    }

    public void setInstalaciones(ArrayList<inst_Empleado> instalaciones) {
        this.instalaciones = instalaciones;
    }
    private int dia;
    private int mes;
    private int anio;

    public int getAnio() {
        return anio;
    }

    public void setAnio(int anio) {
        this.anio = anio;
    }

    public int getDia() {
        return dia;
    }

    public void setDia(int dia) {
        this.dia = dia;
    }

    public int getMes() {
        return mes;
    }

    public void setMes(int mes) {
        this.mes = mes;
    }

    public ArrayList<Tipoorden> getTipoordenList() {
        return tipoordenList;
    }

    public void setTipoordenList(ArrayList<Tipoorden> tipoordenList) {
        this.tipoordenList = tipoordenList;
    }

    public String getLastNovedad(int orden) {
        String nov = "";
        try {
            for (int i = 0; i < novedad.findAll().size(); i++) {
                if (novedad.findAll().get(i).getIdOrden() == orden) {
                    nov = getRazon(novedad.findAll().get(i).getRazon()) + ": " + novedad.findAll().get(i).getDescripcion();
                }
            }
        } catch (Exception e) {
            return "";
        }
        return nov;
    }

    public String getRazon(int id_razon) {
        try {
            for (int i = 0; i < razon.findAll().size(); i++) {
                if (id_razon == razon.findAll().get(i).getIdRazon()) {
                    return razon.findAll().get(i).getDescripcion();
                }
            }
        } catch (Exception e) {
            return "";
        }
        return "";
    }

    public String getEstado(int id_estado) {
        try {
            for (int i = 0; i < estadoFacade.findAll().size(); i++) {
                if (estadoFacade.findAll().get(i).getIdEstado() == id_estado) {
                    return estadoFacade.findAll().get(i).getDescripcion();
                }
            }
        } catch (Exception e) {
            return "";
        }
        return "";
    }
    private ArrayList<orden_mant> mantenimiento = new ArrayList<orden_mant>();

    public ArrayList<orden_mant> getMantenimiento() {
        return mantenimiento;
    }

    public void setMantenimiento(ArrayList<orden_mant> mantenimiento) {
        this.mantenimiento = mantenimiento;
    }
    private int dia_f;
    private int mes_f;
    private int anio_f;

    public int getAnio_f() {
        return anio_f;
    }

    public void setAnio_f(int anio_f) {
        this.anio_f = anio_f;
    }

    public int getDia_f() {
        return dia_f;
    }

    public void setDia_f(int dia_f) {
        this.dia_f = dia_f;
    }

    public int getMes_f() {
        return mes_f;
    }

    public void setMes_f(int mes_f) {
        this.mes_f = mes_f;
    }

    public void productosbyRangeDate() {
        ArrayList<String> prods = new ArrayList<String>();
        ArrayList<Integer> orden_prod = new ArrayList<Integer>();
        Date inicio = new Date(anio - 1900, mes-1, dia, 0, 0, 0);
        Date fin = new Date(anio_f - 1900, mes_f-1, dia_f, 23, 59, 59);
        boolean add_prod = true;
        for (int i = 0; i < orden.findAll().size(); i++) {
            add_prod = true;

            if (orden.findAll().get(i).getFechaHora().before(fin) && orden.findAll().get(i).getFechaHora().after(inicio)) {
                if (true) {
                    for (int j = 0; j < prods.size(); j++) {
                        if (prods.get(j).equals(orden.findAll().get(i).getProductoID())) {
                            add_prod = false;
                        }
                    }
                    if (add_prod == true) {
                        prods.add(orden.findAll().get(i).getProductoID());
                        orden_prod.add(orden.findAll().get(i).getIdOrden());
                    }
                }
            }

        }

        Producto descriptor = null;
        Estadoproductofecha est = null;
        String prod = "";
        String estado_prod = "";
        String descripcion_prod = "";
        String novedad_prod = "";
        int id_estado = 0;

        for (int i = 0; i < prods.size(); i++) {
            descriptor = getProductobyID(prods.get(i));
            est = getlastEstadoproductofecha(prods.get(i));

            if (prods.get(i) == null) {
                prod = "N/A";
            } else {
                prod = prods.get(i);
            }

            try {
                estado_prod = getEstado(est.getEstadoidEstado());
                id_estado = est.getEstadoidEstado();
            } catch (Exception e) {
                estado_prod = "N/A";
                id_estado = 0;
            }


            if (descriptor.getDescripcion() == null) {
                descripcion_prod = "N/A";
            } else {
                descripcion_prod = descriptor.getDescripcion();
            }
            if (getLastNovedad(orden_prod.get(i)).equals("")) {
                novedad_prod = "N/A";
            } else {
                novedad_prod = getLastNovedad(orden_prod.get(i));
            }
            orden_mant temp = new orden_mant(prod, descripcion_prod, estado_prod, novedad_prod);
            temp.setId_estado(id_estado);

            mantenimiento.add(temp);
        }
        if (mantenimiento.isEmpty()){
            setRes("No existen órdenes en los rangos indicados, por favor verifique las fechas");
        }
    }
    private ArrayList<orden_mant> ordenes_mapa = new ArrayList<orden_mant>();

    public void productosbyDate() {
        ArrayList<String> prods = new ArrayList<String>();
        ArrayList<Integer> orden_prod = new ArrayList<Integer>();
        boolean add_prod = true;
        for (int i = 0; i < orden.findAll().size(); i++) {
            add_prod = true;

            if (orden.findAll().get(i).getFechaHora().getDate() == dia) {
                if (orden.findAll().get(i).getFechaHora().getMonth() + 1 == mes) {
                    if (orden.findAll().get(i).getFechaHora().getYear() + 1900 == anio) {
                        for (int j = 0; j < prods.size(); j++) {
                            if (prods.get(j).equals(orden.findAll().get(i).getProductoID())) {
                                add_prod = false;
                            }
                        }
                        if (add_prod == true) {
                            prods.add(orden.findAll().get(i).getProductoID());
                            orden_prod.add(orden.findAll().get(i).getIdOrden());
                        }
                    }
                }
            }

        }

        Producto descriptor = null;
        Estadoproductofecha est = null;
        String prod = "";
        String estado_prod = "";
        String descripcion_prod = "";
        String novedad_prod = "";
        int id_estado = 0;

        for (int i = 0; i < prods.size(); i++) {
            descriptor = getProductobyID(prods.get(i));
            est = getlastEstadoproductofecha(prods.get(i));

            if (prods.get(i) == null) {
                prod = "N/A";
            } else {
                prod = prods.get(i);
            }

            try {
                estado_prod = getEstado(est.getEstadoidEstado());
                id_estado = est.getEstadoidEstado();
            } catch (Exception e) {
                estado_prod = "N/A";
                id_estado = 0;
            }


            if (descriptor.getDescripcion() == null) {
                descripcion_prod = "N/A";
            } else {
                descripcion_prod = descriptor.getDescripcion();
            }
            if (getLastNovedad(orden_prod.get(i)).equals("")) {
                novedad_prod = "N/A";
            } else {
                novedad_prod = getLastNovedad(orden_prod.get(i));
            }
            orden_mant temp = new orden_mant(prod, descripcion_prod, estado_prod, novedad_prod);
            temp.setId_estado(id_estado);
            try {
                temp.setLatitud(descriptor.getLatitud());
                temp.setLongitud(descriptor.getLongitud());
                ordenes_mapa.add(temp);
            } catch (Exception e) {
            }
        }
    }

    public int getLastEstado(String EAN_act) {
        int est_num = 0;
        Date temp = new Date(anio - 1900, mes, dia);
        for (int i = 0; i < estadoproductofechaFacade.findAll().size(); i++) {
            if (estadoproductofechaFacade.findAll().get(i).getEstadoproductofechaPK().getEan().equals(EAN_act)) {
                if (estadoproductofechaFacade.findAll().get(i).getEstadoproductofechaPK().getFechaEstado().getDate() == dia) {
                    if (estadoproductofechaFacade.findAll().get(i).getEstadoproductofechaPK().getFechaEstado().getMonth() + 1 == mes) {
                        if (estadoproductofechaFacade.findAll().get(i).getEstadoproductofechaPK().getFechaEstado().getYear() + 1900 == anio) {
                            temp = estadoproductofechaFacade.findAll().get(i).getEstadoproductofechaPK().getFechaEstado();
                            est_num = estadoproductofechaFacade.findAll().get(i).getEstadoidEstado();
                        }
                    }
                }
            }
        }
        return est_num;
    }

    public class inst_Empleado {

        private String cod_producto;
        private String descripcion;
        private String nombre_empl;
        private String fecha;
        private String ubicacion;

        public String getCod_producto() {
            return cod_producto;
        }

        public void setCod_producto(String cod_producto) {
            this.cod_producto = cod_producto;
        }

        public String getDescripcion() {
            return descripcion;
        }

        public void setDescripcion(String descripcion) {
            this.descripcion = descripcion;
        }

        public String getFecha() {
            return fecha;
        }

        public void setFecha(String fecha) {
            this.fecha = fecha;
        }

        public String getNombre_empl() {
            return nombre_empl;
        }

        public void setNombre_empl(String nombre_empl) {
            this.nombre_empl = nombre_empl;
        }

        public String getUbicacion() {
            return ubicacion;
        }

        public void setUbicacion(String ubicacion) {
            this.ubicacion = ubicacion;
        }

        public inst_Empleado(String cod_producto, String descripcion, String nombre_empl, String fecha, String ubicacion) {
            this.cod_producto = cod_producto;
            this.descripcion = descripcion;
            this.nombre_empl = nombre_empl;
            this.fecha = fecha;
            this.ubicacion = ubicacion;
        }
    }

    public class orden_mant {

        private String cod_producto;
        private String descripcion;
        private String estado;
        private String razon;
        private int id_estado;
        private double longitud;
        private double latitud;

        public double getLatitud() {
            return latitud;
        }

        public void setLatitud(double latitud) {
            this.latitud = latitud;
        }

        public double getLongitud() {
            return longitud;
        }

        public void setLongitud(double longitud) {
            this.longitud = longitud;
        }

        public int getId_estado() {
            return id_estado;
        }

        public void setId_estado(int id_estado) {
            this.id_estado = id_estado;
        }

        public String getCod_producto() {
            return cod_producto;
        }

        public void setCod_producto(String cod_producto) {
            this.cod_producto = cod_producto;
        }

        public String getDescripcion() {
            return descripcion;
        }

        public void setDescripcion(String descripcion) {
            this.descripcion = descripcion;
        }

        public String getEstado() {
            return estado;
        }

        public void setEstado(String estado) {
            this.estado = estado;
        }

        public String getRazon() {
            return razon;
        }

        public void setRazon(String razon) {
            this.razon = razon;
        }

        public orden_mant(String cod_producto, String descripcion, String estado, String razon) {
            this.cod_producto = cod_producto;
            this.descripcion = descripcion;
            this.estado = estado;
            this.razon = razon;
        }
    }

    public void GoogleMap() {
        productosbyDate();
        String mapa_head =
                "<html>\n"
                + "<head>\n"
                + "<meta name=\"viewport\" content=\"initial-scale=1.0, user-scalable=no\" />\n"
                + "<script type=\"text/javascript\" src=\"http://maps.google.com/maps/api/js?sensor=false\"></script>\n"
                + "<script type=\"text/javascript\">\n"
                + "google.maps.event.addDomListener(window, 'load', function() {\n"
                + "var map = new google.maps.Map(document.getElementById('map'), {\n"
                + "zoom: 2,"
                + "center: new google.maps.LatLng(0.0, 0.0),\n"
                + "mapTypeId: google.maps.MapTypeId.ROADMAP\n"
                + "});\n\n"
                + "var infoWindow = new google.maps.InfoWindow;\n";

        String marcadores = "";
        for (int i = 0; i < ordenes_mapa.size(); i++) {

            marcadores = marcadores + "var marker" + (i + 1) + "= new google.maps.Marker({\n"
                    + "map: map,\n"
                    + "position: new google.maps.LatLng(" + ordenes_mapa.get(i).getLatitud() + "," + ordenes_mapa.get(i).getLongitud() + ")\n"
                    + "});\n"
                    + "var onMarkerClick = function() {\n"
                    + "var marker = this;\n"
                    + "var latLng = marker.getPosition();\n"
                    + "infoWindow.setContent('<h2>Estado de producto:</h2>' +\n"
                    + "'<h3>EAN:" + ordenes_mapa.get(i).getCod_producto() + " </h3>'+\n"
                    + "'<h3>Descripción:" + ordenes_mapa.get(i).getDescripcion() + " </h3>'+\n"
                    + "'<h3>Estado:" + ordenes_mapa.get(i).getEstado() + " </h3>'+\n"
                    + "+latLng.lat() + ', ' + latLng.lng());\n\n"
                    + "infoWindow.open(map, marker);\n"
                    + "};\n"
                    + "google.maps.event.addListener(marker" + (i + 1) + ", 'click', onMarkerClick);\n"
                    + "google.maps.event.addListener(map, 'click', function() {\n"
                    + "infoWindow.close();\n"
                    + "});\n\n";
        }
        String end = "});\n"
                + "</script>\n"
                + "<style type=\"text/css\">\n"
                + "body {"
                + "font-family: sans-serif;\n"
                + "}\n"
                + "#map {\n"
                + "width: 1024px;\n"
                + "height: 800px;\n"
                + "}\n"
                + "</style>\n"
                + "</head>\n"
                + "<body>\n"
                + "<h2>Mapa de ubicación de dispositivos</h2>\n"
                + "<div id=\"map\"></div>\n"
                + "</body>\n"
                + "</html>\n";

        mapa_str = mapa_head + marcadores + end;
    }

    public String getMapa_str() {
        return mapa_str;
    }

    public void setMapa_str(String mapa_str) {
        this.mapa_str = mapa_str;
    }
}
